from importlib import import_module
import subprocess
from robot.api.deco import keyword
import time
import socket

printer = import_module("printer").IndentPrinter(indent=0)

def get_current_wifi():
    """获取当前连接的 Wi-Fi 信息"""
    try:
        # 执行 netsh 命令
        result = subprocess.run(
            ["netsh", "wlan", "show", "interfaces"],
            capture_output=True,
            text=True,
            check=True,
        )

        # 解析输出，提取 SSID（Wi-Fi 名称）
        output = result.stdout
        for line in output.splitlines():
            if "SSID" in line and "BSSID" not in line:  # 避免匹配到 BSSID
                return line.split(":")[1].strip()  # 提取 SSID

        return None  # 如果未找到 SSID，返回 None
    except subprocess.CalledProcessError as e:
        printer("无法获取 Wi-Fi 信息：", e)
        return None


def list_available_wifi():
    """列出所有可用的 Wi-Fi 网络"""
    try:
        result = subprocess.run(
            ["netsh", "wlan", "show", "networks"],
            capture_output=True,
            text=True,
            check=True,
        )
        printer("可用的 Wi-Fi 网络：")
        printer(result.stdout)
    except subprocess.CalledProcessError as e:
        printer("无法列出 Wi-Fi 网络：", e)


def connect_to_wifi(ssid, password):
    """连接到指定的 Wi-Fi 网络"""
    # 创建一个临时的 Wi-Fi 配置文件
    wifi_config = f"""<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
    <name>{ssid}</name>
    <SSIDConfig>
        <SSID>
            <name>{ssid}</name>
        </SSID>
    </SSIDConfig>
    <connectionType>ESS</connectionType>
    <connectionMode>manual</connectionMode>
    <MSM>
        <security>
            <authEncryption>
                <authentication>WPA2PSK</authentication>
                <encryption>AES</encryption>
                <useOneX>false</useOneX>
            </authEncryption>
            <sharedKey>
                <keyType>passPhrase</keyType>
                <protected>false</protected>
                <keyMaterial>{password}</keyMaterial>
            </sharedKey>
        </security>
    </MSM>
</WLANProfile>
"""
    config_path = "temp_wifi_config.xml"
    with open(config_path, "w") as f:
        f.write(wifi_config)

    try:
        # 使用 netsh 命令连接到 Wi-Fi
        subprocess.run(
            ["netsh", "wlan", "add", "profile", f"filename={config_path}"], check=True
        )
        subprocess.run(["netsh", "wlan", "connect", f"name={ssid}"], check=True)
        printer(f"成功连接到 Wi-Fi: {ssid}")
    except subprocess.CalledProcessError as e:
        printer("连接失败：", e)
    finally:
        # 删除临时配置文件
        import os

        if os.path.exists(config_path):
            os.remove(config_path)


def check_ping(host, timeout=1000):
    """
    使用 ping 检查目标主机是否可达。
    :param host: 目标主机的 IP 地址或域名
    :param timeout: 超时时间（毫秒）
    :return: 如果可达返回 True，否则返回 False
    """
    try:
        # Windows 系统的 ping 命令
        result = subprocess.run(
            ["ping", "-n", "1", "-w", str(timeout), host],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
            check=True,
        )
        printer(result.stdout)
        return True  # 如果 ping 成功，返回 True
    except subprocess.CalledProcessError:
        return False  # 如果 ping 失败，返回 False


def wait_for_system(host, port=None, timeout=30, interval=2):
    """
    等待目标系统可用。
    :param host: 目标主机的 IP 地址或域名
    :param port: 可选的目标端口号
    :param timeout: 总超时时间（秒）
    :param interval: 检测间隔时间（秒）
    :return: 如果系统可用返回 True，否则返回 False
    """
    start_time = time.time()
    while time.time() - start_time < timeout:
        if port:
            printer(f"{host}:{port} 连接检测...")
            if check_port(host, port):  # 检查端口是否可用
                return True
        else:
            printer(f"{host} 连接检测...")
            if check_ping(host):  # 检查 ping 是否可达
                return True
        time.sleep(interval)  # 等待一段时间后重试
    return False


def check_port(host, port, timeout=5):
    """
    检查目标主机的指定端口是否开放。
    :param host: 目标主机的 IP 地址或域名
    :param port: 目标端口号
    :param timeout: 超时时间（秒）
    :return: 如果端口开放返回 True，否则返回 False
    """
    try:
        with socket.create_connection((host, port), timeout=timeout):
            return True  # 如果连接成功，返回 True
    except (socket.timeout, ConnectionRefusedError, OSError):
        return False  # 如果连接失败，返回 False


@keyword("连接外网")
def connect_to_internet():
    connect_to_wifi(ssid="ZDZX-5G", password="zdzx2501")


@keyword("连接内网")
def connect_to_internal():
    connect_to_wifi(ssid="ccx11111", password="12345678")
